package com.study.jdbc.proxy.jdk;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

import org.junit.Test;

/**
* @Name: Client
* @Description: JDK动态代理测试类
* @Author: 李超	lc_jack@foxmail.com
* @CreateDate: 2017-2-18 下午3:34:20 
* @Version: V1.0
 */
public class Client {
	
	
	@Test
	public void noProxy() {
		Human human = new SpringBrother() ;
		human.sing(1000) ;
		human.dance(1000) ;
		human.eat() ;
	}
	
	/**
	* @Name: jdkProxy
	* @Description: 使用JDK动态代理：代理接口的实现类，被代理一定要是接口的实现类
	* @Author: 李超	lc_jack@foxmail.com
	* @Version: V1.0
	* @CreateDate: 2017-2-18 下午3:36:01
	* @Parameters: 
	* @Return: void
	 */
	@Test
	public void jdkProxy() {
		final Human human = new SpringBrother() ;
		//创建代理对象
		Human proxy = (Human) Proxy.newProxyInstance(human.getClass().getClassLoader(), 
				new Class[] {Human.class}, 
				new InvocationHandler() {
					@Override
					public Object invoke(Object proxy, Method method, Object[] args)
							throws Throwable {
						//声明方法执行的返回值
						Object result = null ;
						Float money = null ;
						//接收方法实参
						if(args != null && args.length > 0) {
							money = (Float) args[0] ;
						}
						if("sing".equals(method.getName())) {
							if(money > 100) {
								result = method.invoke(human, args) ;
							} else {
								System.out.println("钱不够(最少100)，不能唱歌！");
							}
						} 
						if("dance".equals(method.getName())) {
							if(money > 1000) {
								result = method.invoke(human, args) ;
							} else {
								System.out.println("钱不够(最少1000)，不能跳舞！");
							}
						} 
						if("eat".equals(method.getName())) {
							result = method.invoke(human, args) ;
						}
						return result ;
					}
				}) ;
		//代理执行接口实现类的方法
		proxy.sing(1000) ;
		proxy.dance(2000) ;
		proxy.eat() ;
	}
	
}











